package com.eksframework.commons.core.tuple;

/**
 * Tuple
 *
 * @author: chenfenghai
 * @version: 1.0
 * @date: 2020-12-23 9:42
 */
public class Tuple {

    /**
     * 私有构造
     */
    private Tuple() {
    }

    /**
     * 1个元组实例化对象
     *
     * @param first 元组1
     * @param <A>   元组1类型
     * @return 元组实例
     */
    public static <A> TupleOne<A> of(A first) {
        return TupleOne.of(first);
    }

    /**
     * 2个元组实例化对象
     *
     * @param first  元组1
     * @param second 元组2
     * @param <A>    元组1类型
     * @param <B>    元组2类型
     * @return 元组实例
     */
    public static <A, B> TupleTwo<A, B> of(A first, B second) {
        return TupleTwo.of(first, second);
    }

    /**
     * 3个元组实例化对象
     *
     * @param first  元组1
     * @param second 元组2
     * @param third  元组3
     * @param <A>    元组1类型
     * @param <B>    元组2类型
     * @param <C>    元组3类型
     * @return 元组实例
     */
    public static <A, B, C> TupleThree<A, B, C> of(A first, B second, C third) {
        return TupleThree.of(first, second, third);
    }

    /**
     * 4个元组实例化对象
     *
     * @param first  元组1
     * @param second 元组2
     * @param third  元组3
     * @param fourth 元组4
     * @param <A>    元组1类型
     * @param <B>    元组2类型
     * @param <C>    元组3类型
     * @param <D>    元组4类型
     * @return 元组实例
     */
    public static <A, B, C, D> TupleFour<A, B, C, D> of(
            A first, B second, C third, D fourth) {
        return TupleFour.of(first, second, third, fourth);
    }

    /**
     * 5个元组实例化对象
     *
     * @param first  元组1
     * @param second 元组2
     * @param third  元组3
     * @param fourth 元组4
     * @param fifth  元组5
     * @param <A>    元组1类型
     * @param <B>    元组2类型
     * @param <C>    元组3类型
     * @param <D>    元组4类型
     * @param <E>    元组5类型
     * @return 元组实例
     */
    public static <A, B, C, D, E> TupleFive<A, B, C, D, E> of(
            A first, B second, C third, D fourth, E fifth) {
        return TupleFive.of(first, second, third, fourth, fifth);
    }

    /**
     * 6个元组实例化对象
     *
     * @param first  元组1
     * @param second 元组2
     * @param third  元组3
     * @param fourth 元组4
     * @param fifth  元组5
     * @param sixth  元组6
     * @param <A>    元组1类型
     * @param <B>    元组2类型
     * @param <C>    元组3类型
     * @param <D>    元组4类型
     * @param <E>    元组5类型
     * @param <F>    元组6类型
     * @return 元组实例
     */
    public static <A, B, C, D, E, F> TupleSix<A, B, C, D, E, F> of(
            A first, B second, C third, D fourth, E fifth, F sixth) {
        return TupleSix.of(first, second, third, fourth, fifth, sixth);
    }
}
